#class gotovAutomat:
import generator_automata
def reg(izraz,definicije):
    ignore=0
    i=0
    b=izraz
    while(b[i]!="\n"):
        if b[i]=="{" and ignore==0:

            c=b[0:i]
            d=b[i:]
            kraj=d.find("}")
            definicija=d[:kraj+1]
            d=d[kraj+1:]
            b=c+'('+definicije[definicija]+')'+d


        if ignore==1:
            ignore=0
        elif b[i]=='\\':
            ignore=1

        i=i+1

        
    return b




class Generator:

    def __init__(self):
        self.regDefinicije = {}
        self.stanjaAnalizatora = []
        self.lexJedinke = []


    def obradi_zaglavlje(self, datoteka): #parsira sve do retka %L i sprema u varijable
        regularni_izrazi={}
        #datoteka=open('ulaz.txt', 'r')
        temp=datoteka.readline()
        while(temp[0:2]!="%X"):
            kraj=temp.find(" ")
            a=temp[0:kraj]
            b=temp[kraj+1:len(temp)]
            ignore=0
            i=0
            while(b[i]!="\n"):
                if b[i]=="{" and ignore==0:
                    kraj=b.find("}")
                    c=b[0:i]
                    d=b[kraj+1:]
                    definicija=b[i:kraj+1]
                    b=c+'('+regularni_izrazi[definicija]+')'+d
                if ignore==1:
                    ignore=0
                elif b[i]=='\\':
                    ignore=1
                i=i+1
            regularni_izrazi[a]=b[:len(b)-1]
            #print(a, regularni_izrazi[a])
            temp=datoteka.readline()

        self.regDefinicije = regularni_izrazi
        self.stanjaAnalizatora = temp.split()[1:]
        temp=datoteka.readline()

        self.lexJedinke = temp.split()[1:]

        #print("definicije:", self.regDefinicije)
        #print("stanjaAnalizatora", self.stanjaAnalizatora)
        #print("lexJedinke", self.lexJedinke)
    def stvoriAutomate(self, datoteka):
        auto = generator_automata.generator_automata()
        izlazdat = open('izlaz.txt','w')
        tr = self.stanjaAnalizatora[0] + '\n'
        izlazdat.write(tr)
        for line in datoteka:
            auto.reset()
            if line[0] == '<':
                #podjela1 = line[1:].split('>')
                x=line.find('>')
                line1=line[1:x]
                line2=line[x+1:]
                izlazdat.write(line1)
                izlazdat.write('\n')
                line2 = reg(line2, self.regDefinicije)
                izlazdat.write(line2)
            elif line[0] == '{':
                continue
            elif line[0] == '}':
                izlazdat.write('***\n')
                if line2 != '\n':
                    line2 = line2.strip('\n')
                auto.pretvori(line2)
                auto.pisi_u_datoteku(izlazdat)
                continue
            else:
                if line.strip() in self.lexJedinke :
                    izlazdat.write(line)
                else:
                    izlazdat.write(line)
        izlazdat.close()
def main():

    auto = generator_automata.generator_automata()
    generiranje = Generator()
    datoteka=open("ulaz.txt","r")
    generiranje.obradi_zaglavlje(datoteka)
    #print(generiranje.regDefinicije)
    #print(reg('{hexZnamenka}{hexZnamenka}*\n',generiranje))
    generiranje.stvoriAutomate(datoteka)
    datoteka.close()


if __name__ == '__main__':
    main()